/*
抽象观察者（Observer）
里面定义了一个更新的方法：
class Observer { //抽象类
public:
	virtual void update(string message) = 0; //更新行为,纯虚函数
};
具体观察者（ConcrereObserver）
微信用户是观察者，里面实现了更新的方法：
class WeixinUser : public Observer
{
private:
	string name; // 微信用户名
public:
	WeixinUser(string name) {
		this->name = name;
	}
	virtual void update(string message) {
		cout << endl << (name + " knows " + message);
		this->doSomething();
	}
	virtual void doSomething()
	{
		cout << endl << name << " is very happy";
	}
};
抽象被观察者（Subject）
抽象主题，提供了attach、detach、notify三个方法：

class Subject { //抽象类
public:
	virtual void attach(Observer* observer) = 0; //增加订阅者,纯虚函数
	virtual void detach(Observer* observe) = 0; //删除订阅者,纯虚函数
	virtual void notify(string message) = 0; //通知订阅者更新消息,纯虚函数
};
具体被观察者（ConcreteSubject）
微信公众号是具体主题（具体被观察者），里面存储了订阅该公众号的微信用户，并实现了抽象主题中的方法：
class SubscriptionSubject : public Subject
{
private:
	list<Observer*> weixinUserlist; //储存订阅公众号的用户
public:
	virtual void attach(Observer* observer);
	virtual void detach(Observer* observer);
	virtual void notify(string message);
};
客户端调用
int main()
{
	SubscriptionSubject CAUBlog;
	string name1, name2, name3;
	cin >> name1 >> name2 >> name3;
	WeixinUser zhangsan(name1), lisi(name2);
	ReporterUser wangwu(name3);
	//用户关注
	CAUBlog.attach(&zhangsan);
	CAUBlog.attach(&lisi);
	CAUBlog.attach(&wangwu);
	CAUBlog.notify("2018农大招生了");
	//用户取消关注
	CAUBlog.detach(&lisi);
	CAUBlog.notify("2018农大招生结束了");
	return 0;
}
样例输入：
奥巴马
特普朗
柴静
输出：
奥巴马 knows 2018农大招生了
奥巴马 is very happy
特普朗 knows 2018农大招生了
特普朗 is very happy
柴静 knows 2018农大招生了
柴静 is going to write a report
奥巴马 knows 2018农大招生结束了
奥巴马 is very happy
柴静 knows 2018农大招生结束了
柴静 is going to write a report
提示：
1、本题考查继承的作用，以及观察者模式的理解。
2、本题的实质考点是STL，list的应用
3.使用观察者模式的场景和优缺点
*/

0 0
3 5
2 4
9 8
2 3
8 9
7 6
2 9
5 8
6 6